home *** CD-ROM | disk | FTP | other *** search
- //
- // File: My68KGet1Rsrc.c
- // Project: IsNative.π
- // Author: Glenn L. Austin
- // Symantec Corporation
- //
- #include "IsNative.h"
-
- static Boolean inCheckRsrc = false;
-
- void CheckRsrc(Handle rsrc, short id, ResType rType)
- {
- if (inCheckRsrc) // I end up calling myself, so don't do anything if so...
- return;
-
- if (!rsrc)
- return; // if there isn't the resource, go ahead and return immediately
-
- if ((*(Byte*) LMGetCurApName() < 32) && (!id && ((rType == 'cfrg') || (rType == 'CODE'))) &&
- !FindAppInfo(LMGetCurApName()))
- {
- THz cZone = GetZone();
- MyAppInfo appInfo;
- Handle h;
- short oldResLoad;
-
- BlockMove(LMGetCurApName(), &appInfo.appName, sizeof(Str31));
- appInfo.flags = 0;
- if (rType == 'cfrg')
- {
- appInfo.flags |= kIsNative;
-
- oldResLoad = LMGetResLoad();
- SetResLoad(false);
- inCheckRsrc = true;
- h = Get1Resource('CODE', 0); // check for 68K code...
- inCheckRsrc = false;
- LMSetResLoad(oldResLoad);
-
- if (appInfo.flags && h)
- appInfo.flags |= kHas68K;
- }
-
- SetZone(SystemZone());
- PtrAndHand((Ptr) &appInfo, (Handle) glob->appInfo, sizeof(MyAppInfo));
- SetZone(cZone);
- }
- }
-
- void MyGet1Resource(void)
- {
- asm {
- Link A6,#-12 ; stack frame looks like: A6.L, (4)retAddr.L, (8)id.W, (10)type.L
-
- Movem.L D0/A0,-8(A6)
-
- Jsr SetA4World
- Move.L D0,-12(A6)
-
- Clr.L -(SP)
- Move.L 10(A6),-(SP)
- Move 8(A6),-(SP)
- Pea @1
- Move.L glob,A0
- Move.L OFFSET(MyGlobals,oldG1RTrap)(A0),-(SP)
- Movem.L -8(A6),D0/A0
- Move.L -12(A6),A4
- Move.L (A6),A6 ; clean up A6
- Rts ; on return, stack looks like: handle.L, oldA4.L, D0.L, A1.L, A6.L
- @1 Lea 8+8(SP),A6
- Move.L (SP)+,14(A6)
- Movem.L D0-D2/A0-A1,-(SP)
- Jsr SetA4World
- Move.L 10(A6),-(SP)
- Move 8(A6),-(SP)
- Move.L 14(A6),-(SP)
- Bsr CheckRsrc
- Lea 10(SP),SP
- Movem.L (SP)+,D0-D2/A0-A1
-
- Move.L -12(A6),A4
- Unlk A6
-
- Move.L (SP)+,2(SP) ; I could use RTD #6, if it only existed on the 68000...
- Addq #2,SP
- }
- }
-